package day7.impl_pool;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
/**
 * 一个临时线程需要进行的工作
 */
public class TemporaryJob implements Runnable {
    // 需要阻塞队列
    private final BlockingQueue<Runnable> workQueue;
    private final long keepAliveTime;
    private final TimeUnit unit;
    private Runnable curCommand;

    TemporaryJob(long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, Runnable curCommand) {
        this.keepAliveTime = keepAliveTime;
        this.unit = unit;
        this.workQueue = workQueue;
        this.curCommand = curCommand;
    }

    @Override
    public void run() {
        try {
            curCommand.run();     // 优先先把刚提交的任务先做掉了
            curCommand = null;    // 这里设置 null 的意思是，不影响 curCommand 对象被 GC 时的回收

            // 一旦超过一定时间没有任务，临时工是需要退出的
            // 1. keepAliveTime + unit 记录起来
            // 2. 怎么就知道超过多久没有任务了？如果一定时间内都无法从队列中取出来任务，则认为摸鱼时间够了
            while (!Thread.interrupted()) {
                // 规定时间内取不出来就不取了
                Runnable command = workQueue.poll(keepAliveTime, unit);
                if (command == null) {
                    // 说明最大空闲时间内，没有取到任务，可以退出了
                    break;
                    // 退出后，该线程的任务就算结束了，系统会自动销毁该线程
                }
                command.run();
            }
        } catch (InterruptedException ignored) {}
    }
}
